package cn.tedu.sp06.filter;

import cn.tedu.web.util.JsonResult;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 权限判断过滤器，判断是否有token令牌，没有则拒绝访问
 * 暂时只检测 服务ID为：item-service 的服务
 */
@Component
public class AccessFilter extends ZuulFilter {
    // 设置过滤器的类型，pre,routing,post,error
    @Override
    public String filterType() {
//        return "pre";     两种写法相同效果    设置为前置过滤器
        return FilterConstants.PRE_TYPE;
    }
    // 设置顺序号
    @Override
    public int filterOrder() {
        //前置过滤器中有五个默认的过滤器，自定义过滤器放到末尾
        //默认第五个过滤器放入了serviceId
        return 6;
    }

    /** 针对当前请求，是否要执行下面的过滤代码
     *  调用商品，需要判断权限
     *  调用用户或订单不检查权限
     * @return
     */
    @Override
    public boolean shouldFilter() {
        //获得一个请求上下文对象，从上下文对象获取调用的后台服务的 serviceId
        RequestContext ct = RequestContext.getCurrentContext();
        String serviceId=(String)
                ct.get(FilterConstants.SERVICE_ID_KEY);     //如果知道Key则可直接输入Key 如："service-id"
        //如果调用的是item-service 则返回true，否则false
        return "item-service".equals(serviceId);
    }
    // 过滤代码 查询是否有token且不为空或空白字符串或空串
    @Override
    public Object run() throws ZuulException {
        //获取上下文对象
        RequestContext rc=RequestContext.getCurrentContext();
        //获得request对象
        HttpServletRequest request = rc.getRequest();
        //接收token参数
        String token=request.getParameter("token");
        //如果token不存在    判断""空串,null," "空白字符为空  使用apache的lang或lang3
        if (StringUtils.isBlank(token)) {
            //阻止继续调用
            rc.setSendZuulResponse(false);
            //直接返回响应，json字符串    JsonResult - {code:400,msg:"未登陆",data:null}
            String json=JsonResult.build()
                    .code(400).msg("Not Login! 未登录").toString();
            //设置响应头
            rc.addZuulResponseHeader("Content-Type","application/json;charset=UTF-8");
            //设置响应体
            rc.setResponseBody(json);
        }
        return null;        //zuul这个版本返回值不起作用
    }
}
